\section{Ejercicio 7: \textit{minimax}}
\subsection{Enunciado}
Considerando el tipo \texttt{type Valuacion = Juego $\to$ Double}, definir la funci\'on
\texttt{
\\mejorMovimiento :: Valuacion $\to$ ArbolJugadas $\to$ Movimiento
}
\\que, dada una funci\'on de valuaci\'on y un arbol de jugadas, devuelva el movimiento m\'as
conveniente para el jugador en la ra\'iz.
\\Denirla utilizando foldArbol , sin recursi\'on expl\'icita. Utilizar el algoritmo minimax2, con
la funci\'on de valuaci\'on dada, para determinar el mejor movimiento. Asumir que el \'arbol de
jugadas viene podado (y por lo tanto es infinito).
\\\emph{Sugerencia:} definir la funci\'on
\texttt{
\\minimax :: Valuacion $\to$ ArbolJugadas $\to$ (Double,[Movimiento])
}
\\que devuelva la mejor valuaci\'on obtenida por el algoritmo minimax, acompa\~nada de la secuencia
de movimientos que conducen desde la ra\'iz del \'arbol hasta el estado del juego que
tiene dicho valor.
\\Asumir que la funci\'on de valuaci\'on devuelve un numero entre -1 y 1, que indica cuan
favorable es el estado del juego para el jugador al que le toca mover. Si la funci\'on de valuaci\'on
toma los valores -1 o 1 en el estado actual del juego, se debe devolver este valor, sin visitar
los hijos del nodo.
\subsection{Codigo}

\scriptsize\begin{verbatim}

 mejorMovimiento :: Valuacion -> ArbolJugadas -> Movimiento
 mejorMovimiento v a = (head.snd) (minimax v a)

 -- chooseF devuelve el x en la lista que decide el criterio f
 chooseF :: (a -> a -> Bool) -> [a] -> a
 chooseF f = foldr1 (\x y -> if f x y then x else y)

 minimax :: Valuacion -> ArbolJugadas -> (Double, [Movimiento])
 minimax v = foldArbol f g
    where
        chooseMin = chooseF (\x y -> (fst x) < (fst y))
        chooseMax = chooseF (\x y -> (fst x) >= (fst y))
        g = \xs -> if (null xs) then Nothing else Just ( (chooseMin xs, chooseMax xs) )
        f = \j rec -> case rec of
            -- si es una hoja, devuelvo la jugada evaluada
            Nothing -> (v (snd j), fst j)
            -- sino elijo segun tengo que minimizar o maximizar la mejor jugada
            Just (minVal, maxVal) -> if (length (fst j) `mod` 2 == 0) then maxVal else minVal

\end{verbatim}
\normalsize
